<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<div class="container" id="container1" role="group" aria-label="Container">
    <div id="heading1" role="heading" aria-owns="menu1">heading</div>
    <div id="menu1" role="menu">menu</div>
</div>

<script>
test(function(t) {
    // No problem with using aria-owns to put a menu inside a heading.
    var axHeading1 = accessibilityController.accessibleElementById("heading1");
    assert_equals(axHeading1.name, "heading");
    var axContainer1 = accessibilityController.accessibleElementById("container1");
    assert_equals(axContainer1.childrenCount, 1);
    assert_equals(axContainer1.childAtIndex(0).role, "AXRole: AXHeading");
}, "Aria-owns should re-parent a target when the source role allows children.");
</script>

<div class="container" id="container2" role="group" aria-label="Container">
    <div id="image2" role="img" aria-owns="menu2">image</div>
    <div id="menu2" role="menu">menu</div>
</div>

<script>
test(function(t)
{
    // An image can't have children, so we should ignore aria-owns.
    var axImage2 = accessibilityController.accessibleElementById("image2");
    var axContainer2 = accessibilityController.accessibleElementById("container2");
    assert_equals(axContainer2.childrenCount, 2);
    assert_equals(axContainer2.childAtIndex(0).role, "AXRole: AXImage");
    assert_equals(axContainer2.childAtIndex(1).role, "AXRole: AXMenu");
}, "Aria-owns doesn't move an element if the role doesn't allow children.");
</script>

<style>
input, textarea {
    display: block;
}
</style>

<div class="container" id="container3" role="group" aria-label="Container">
    <input id="textfield3" aria-owns="menu3" aria-label="textfield">
    <div id="menu3" role="menu">menu</div>
</div>

<script>
test(function(t)
{
    var axTextfield3 = accessibilityController.accessibleElementById("textfield3");
    assert_equals(axTextfield3.name, "textfield");
    var axContainer3 = accessibilityController.accessibleElementById("container3");
    assert_equals(axContainer3.childrenCount, 2);
    assert_equals(axContainer3.childAtIndex(0).role, "AXRole: AXTextField");
    // An input element naturally gets 1 child that corresponds to the anonymous
    // inner editor element.
    assert_equals(axContainer3.childAtIndex(0).childrenCount, 1);
    assert_equals(axContainer3.childAtIndex(1).role, "AXRole: AXMenu");
}, "Aria-owns doesn't create extra children of an input element.");
</script>

<div class="container" id="container4" role="group" aria-label="Container">
    <textarea id="textfield4" aria-owns="menu4" aria-label="textfield">
    </textarea>
    <div id="menu4" role="menu">menu</div>
</div>

<script>
test(function(t)
{
    var axTextfield4 = accessibilityController.accessibleElementById("textfield4");
    assert_equals(axTextfield4.name, "textfield");
    var axContainer4 = accessibilityController.accessibleElementById("container4");
    assert_equals(axContainer4.childrenCount, 2);
    assert_equals(axContainer4.childAtIndex(0).role, "AXRole: AXTextField");
    assert_equals(axContainer4.childAtIndex(1).role, "AXRole: AXMenu");
}, "Aria-owns doesn't create children of a textarea element.");
</script>

<div class="container" id="container5" role="group" aria-label="Container">
    <div id="textfield5" aria-owns="menu5" aria-label="textfield"
         contentEditable="true">
    </div>
    <div id="menu5" role="menu">menu</div>
</div>

<script>
test(function(t)
{
    var axTextfield5 = accessibilityController.accessibleElementById("textfield5");
    assert_equals(axTextfield5.name, "textfield");
    var axContainer5 = accessibilityController.accessibleElementById("container5");
    assert_equals(axContainer5.childrenCount, 2);
    assert_equals(axContainer5.childAtIndex(0).role, "AXRole: AXGenericContainer");
    assert_equals(axContainer5.childAtIndex(0).childrenCount, 0);
    assert_equals(axContainer5.childAtIndex(1).role, "AXRole: AXMenu");
}, "Aria-owns doesn't create children of a contenteditable element.");
</script>
